﻿using EasyModbus;
using System.IO.Ports;
using System.Text;

namespace ModbusTest
{
    public class Program
    {


        #region Modbus TCP
        //保持寄存器（Holding Register）
        //是Modbus协议中的一种寄存器的类型，通常用于存储可读写的数值类型
        //这类寄存器主要用于保存设备的状态，设置参数或其他需要在运行过程中可变的值。
        //特点：
        //1. 可读可写：保持寄存器可以读取和写入数据，用于存储设备的当前状态和配置参数。
        //2. 长期存储：保持寄存器的值在设备断电后不会丢失，可以用于保存设备的配置信息。
        //3. 16位数据：每个保持寄存器存储16位（2字节）的数据，因此可以存储的数值范围是 0 到 65,535（无符号整数），
        //            或者 -32,768 到 32,767（有符号整数），视应用场景而定。
        #endregion

        static void Main(string[] args)
        {
            ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502);
            try
            {
                // 连接到 Modbus 服务器
                modbusClient.Connect();
                Console.WriteLine("Connected to Modbus server.");

                // 读取地址为 40001 的保持寄存器（4xxxx 地址实际对应代码中的地址 0 开始）
                int registerAddress = 0; // 40001 - 40001 = 0
                int[] registerValues = modbusClient.ReadHoldingRegisters(registerAddress, 1);

                Console.WriteLine($"Register[40001] Value: {registerValues[0]}");



                // 写入新值到地址为 40001 的保持寄存器
                int newValue = 5678; // 要写入的值
                modbusClient.WriteSingleRegister(registerAddress, newValue);
                Console.WriteLine($"Wrote {newValue} to Register[40001]");


                // 重新读取以确认写入成功
                registerValues = modbusClient.ReadHoldingRegisters(registerAddress, 1);
                Console.WriteLine($"After write, Register[40001] Value: {registerValues[0]}");



                // 写入线圈状态（Coils）
                modbusClient.WriteSingleCoil(0, true);
                bool[] coilStatus = modbusClient.ReadCoils(0, 1);
                Console.WriteLine($"Coil[0] Status: {coilStatus[0]}");




            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
            finally
            {
                // 断开连接
                modbusClient.Disconnect();
                Console.WriteLine("Disconnected from Modbus server.");
            }
        }
    }
}


#region Modbus TCP
//除了保持寄存器，Modbus协议还定义了其他几种寄存器类型
//1. 输入寄存器（Input Register）：只读寄存器，用于存储从传感器或输入设备读取的数值，例如温度、压力等  地址:3xxxx开头
//2. 线圈（Coils）: 只读/只写寄存器，用于存储布尔值（真/假），例如开关状态、继电器状态等  地址:0xxxx开头
//3. 离散输入（Discrete Input）：只读寄存器，用于存储离散输入的状态，例如按钮状态、限位开关状态 2xxxx开头
//4. 定时器和计数器：
//   4.1定时器（Timer）：用途：可用于控制设备的延时启动或停止，地址格式：通常以T开头（如T0）
//   4.2计数器（Counter）：用途：用于记录设备的运行时间或事件发生的次数，地址格式：通常以C开头（如C0）
//内部寄存器：用于存储临时变量和中间计算值，通常不与外部设备直接交互。地址格式：以 M 开头（如 M0.0）。

#endregion
